package servico;

import java.util.List;

import persistencia.dao.GenericDAO;
import persistencia.entidades.Login;
import util.EmailUtil;
import exceptions.EmailFormatoInvalidoException;

/**
 * Classe fornecedora de regras de neg�cios referente ao Login de usu�rios.
 * 
 * @author Maciel Melo
 * @since 10/10/2013
 */
@SuppressWarnings("javadoc")
public class LoginService {

	private final GenericDAO<Login> dao;

	public LoginService() {
		this.dao = new GenericDAO<Login>();
	}

	public LoginService(GenericDAO<Login> dao) {
		this.dao = dao;
	}

	// --------------------CRUD------------------------ //
	/**
	 * Se o email não estiver no formato correto, EmailFormatoInvalidoException
	 * será lançado.
	 */
	public Login saveOrUpdate(Login login) throws EmailFormatoInvalidoException {
		if (EmailUtil.isValido(login.getEmail()) && emailUnico(login)) {
			return dao.insertOrUpdate(login);
		} else {
			String msg = String
					.format("Email: %s no formato inválido ou já existe usuário com esse email",
							login.getEmail());
			throw new EmailFormatoInvalidoException(msg);
		}
	}

	public List<Login> localizarTodos() {
		return dao.findAll(Login.class, false);
	}

	public Login localizarPeloId(Long id) {
		return dao.findById(Login.class, id, false);
	}

	public Login localizarPorEmail(String email) {
		for (Login login : dao.findAll(Login.class, false)) {
			if (email.equalsIgnoreCase(login.getEmail())) {
				return login;
			}
		}
		return null;
	}

	private Boolean emailUnico(Login login) {
		List<Login> logins = dao.findAll(Login.class, false);

		for (Login entidade : logins) {
			if (entidade.getEmail().equalsIgnoreCase(login.getEmail())) {
				return false;
			}
		}

		return true;
	}
}
